#!/bin/bash
#Author: YangYi
#Date: 2025-05-10
#Version: v1
#Content 一键诊断、处置原子能力,应用可用性测试.
#1.待用户输入名称空间和实例名字进行判断
#2.删除单个异常实例名
#3.等待新实例启动并获取实例名，ip，端口等信息
#4.针对新起实例做七层探测
#5.输出探测结果


# ---------------------------初始化全局变量----------------------------

# 检查参数是否传入
if [ -z "$1" ]; then
    echo "错误：请输入名称空间(namespces)"
    exit 1
fi

if [ -z "$2" ]; then
    echo "错误：请输入需要删除的实例名(pod_name)"
    exit 1
fi

namespace=$1
pod_name=$2
#namespace="kube-system"
#pod_name="heapster-5b58dcf75b-dv85w"

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m'

# 从kubeconfig获取token
CURRENT_CONTEXT=$(kubectl config current-context)
USER=$(kubectl config view -o jsonpath="{.contexts[?(@.name == '${CURRENT_CONTEXT}')].context.user}")
TOKEN=$(kubectl describe secret $(kubectl get secret | grep ^default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t' | tr -d ' ')
KUBECONFIG="/root/.kube/config"
APISERVER=$(kubectl config view --minify --flatten --kubeconfig="${KUBECONFIG}" | grep server | cut -d '/' -f3)

# 实例启动时间
startingTime=60


# ----------------------------功能模块函数-----------------------------


# 函数：检查Pod是否存在
check_pod_exists() {
    # 检查命名空间是否存在
    kubectl get namespace "$namespace" >/dev/null 2>&1
    local ns_exists=$?
 
    # 检查Pod是否存在
    kubectl get pod "$pod_name" -n "$namespace" >/dev/null 2>&1
    local pod_exists=$?
 
    # 返回综合判断结果
    if [ $ns_exists -eq 0 ] && [ $pod_exists -eq 0 ]; then
        return 0
    else
        return 1
    fi 
}

# 函数：删除指定Pod
delete_pod() {
    local namespace=$1
    local pod_name=$2
    kubectl delete pod "$pod_name" -n "$namespace" --grace-period=0 --force >/dev/null 2>&1
}

# 函数：等待新Pod创建并返回名称
wait_for_new_pod() {
    local namespace=$1
    local old_pod=$2
    sleep $startingTime  # 等待时长
    
    # 获取最新创建的Pod（排除旧Pod）
    new_pod=$(kubectl get pods -n "$namespace" --sort-by=.metadata.creationTimestamp \
        -o jsonpath='{.items[?(@.status.phase!="Terminating")].metadata.name}' | awk '{print $NF}')
    
    echo "$new_pod"
}

# 函数：检查Pod状态是否为Running
check_pod_status() {
    local namespace=$1
    local pod_name=$2
    local status
    status=$(kubectl get pod "$pod_name" -n "$namespace" -o jsonpath='{.status.phase}' 2>/dev/null)
    [[ "$status" == "Running" ]]
}

# 函数：获取Pod详细信息
get_pod_info() {
    local namespace=$1
    local pod_name=$2
    local pod_ip node container_port service_port service_name

    # 获取基础信息
    pod_ip=$(kubectl get pod "$pod_name" -n "$namespace" -o jsonpath='{.status.podIP}')
    node=$(kubectl get pod "$pod_name" -n "$namespace" -o jsonpath='{.spec.nodeName}')
    
    # 获取容器端口（取第一个容器的第一个端口）
    container_port=$(kubectl get pod "$pod_name" -n "$namespace" \
        -o jsonpath='{.spec.containers[0].ports[0].containerPort}' 2>/dev/null)

    # 获取关联Service信息
    app_label=$(kubectl get pod "$pod_name" -n "$namespace" \
        -o jsonpath='{.metadata.labels.k8s-app}' 2>/dev/null)
    
    if [[ -n "$app_label" ]]; then
        #service_name=$(kubectl get svc -n "$namespace" --selector=app="$app_label" \
            #-o jsonpath='{.items[0].metadata.name}' 2>/dev/null)
        service_port=$(kubectl get svc -n $namespace $app_label |awk '{print $5}' | tail -1   | awk -F "/\|:" '{print $1}' 2>/dev/null)
    fi

    echo "$pod_ip $node $service_port"
}

# 函数：执行四层端口探测
port_probe() {
    local ip=$1
    local port=$2
    local timeout=5

    # 使用bash内置TCP检测（支持IPv4/IPv6）
    if [[ "$port" =~ ^[0-9]+$ ]] && (echo > /dev/tcp/"$ip"/"$port") &>/dev/null; then
        return 0
    elif timeout "$timeout" bash -c "</dev/tcp/$ip/$port" &>/dev/null; then
        return 0
    else
        return 1
    fi
}

# 主流程
main() {
    # 验证Pod存在性
    if ! check_pod_exists "$namespace" "$pod_name"; then
        echo "您输入的资源不存在,请检查名称空间和实例是否正确."
        exit 1
    fi

    # 执行删除操作
    echo "正在删除实例 $pod_name..."
    delete_pod "$namespace" "$pod_name"

    # 等待新Pod创建
    echo "等待新实例创建..."
    new_pod=$(wait_for_new_pod "$namespace" "$pod_name")
    if [[ -z "$new_pod" ]]; then
        echo "错误：未检测到新Pod创建"
        exit 1
    fi

    # 验证新Pod状态
    echo "检查新实例状态..."
    if ! check_pod_status "$namespace" "$new_pod"; then
        echo "错误：新实例 $new_pod 状态异常（当前状态：$(kubectl get pod $new_pod -n $namespace -o jsonpath='{.status.phase}')）"
        exit 1
    fi

    # 获取并显示Pod信息
    read -r pod_ip node service_port <<< "$(get_pod_info "$namespace" "$new_pod")"
    echo "新实例信息："
    echo "名称: $new_pod"
    echo "IP地址: $pod_ip"
    [[ -n "$service_port" ]] && echo "服务端口: $service_port"
    echo "所在节点: $node"

    # 执行端口探测
    echo "执行实例端口探测..."
    if port_probe "$pod_ip" "$service_port"; then
        echo "端口:$service_port 探测成功"
    else
        echo "端口:$service_port 探测失败"
        exit 1
    fi
}

# 执行主流程
main
